home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
docs
/
mb
/
src
/
mbmk.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-05-07
|
3KB
|
210 lines
/* モーションブラー?
*/
#include <iocslib.h>
enum {
GS_NULL,
GS_EXIT,
GS_MAKE,
GS_PLAY
};
int global_step;
#define MAX_ANIM (20)
int MAX_PICNUM; //PICファイルの最終番号
unsigned short g_buf[MAX_ANIM][256*256]; //元データ格納
unsigned short fr_buf[256*256]; //画面出力用
int ANIMS=15; //アニメの枚数
int now_frame; //現在のフレーム番号0~(ANIMS-1)
int vram_page=0; //現在表示中のVRAM(仮想)ページ0,1
int Sync()
{
unsigned short *v,*s;
int np;
int ssp;
short x,y;
// np=(vram_page==0)?1:0;
np=0;
v=(unsigned short *)(0xC00000+np*0x040000);
s=fr_buf;
ssp=B_SUPER(0);
for( y=0; y<256; y++ ){
for( x=0; x<256; x++ ){
*v++=*s++;
}
v+=256;
}
B_SUPER(ssp);
HOME(0,0,np*256);
vram_page=np;
return(0);
}
int Make()
{
#define OV_FRAMES (4) //重ね会わせを行うフレーム数
unsigned short level[OV_FRAMES]; //重ね会わせレベル
unsigned short r[OV_FRAMES],g[OV_FRAMES],b[OV_FRAMES];
unsigned short *s[OV_FRAMES],*d;
unsigned int mr,mg,mb;
short x,y,f;
unsigned char loadname[256];
printf("%02d\x0d",now_frame);
//合計で4096に
// level[0]=2560; level[1]= 768; level[2]= 512; level[3]= 256; //@@4番目がほとんど反映されない
// level[0]=1536; level[1]=1024; level[2]= 896; level[3]= 640; //割と普通?
level[0]=2048; level[1]=384; level[2]= 640; level[3]=1024; //MATRIXっぽい?
// level[0]=1024; level[1]=1024; level[2]=1024; level[3]=1024; //全平均
MAX_PICNUM=20;
for( f=0; f<OV_FRAMES; f++ ){
sprintf(loadname,"M:TEST%03d.PIC",((now_frame-1-f+MAX_PICNUM)%MAX_PICNUM)+1 );
printf(loadname);
Expand_DogaPic(loadname,g_buf[f]);
s[f]=g_buf[f];
}
cls();
d=fr_buf;
//もーしょんブラー本体
for( y=0; y<256; y++ ){ ; for( x=0; x<256; x++ ){
for( f=0; f<OV_FRAMES; f++ ){
r[f]=((*s[f]>>6)&0x1f);
g[f]=((*s[f]>>11)&0x1f);
b[f]=((*s[f]>>1)&0x1f);
s[f]++;
}
mr=0; mg=0; mb=0;
for( f=0; f<OV_FRAMES; f++ ){
mr+=(r[f]*level[f]);
mg+=(g[f]*level[f]);
mb+=(b[f]*level[f]);
}
mr>>=12;
mg>>=12;
mb>>=12;
*d++=((mr<<6)|(mg<<11)|(mb<<1));
}}
#undef OV_FRAMES
quick_exit:
return(0);
}
int Save()
{
// unsigned char savename[256];
unsigned char comline[256];
sprintf(comline,"save OUT%03d.PIC",now_frame);
system(comline);
}
#if 0
int Play()
{
unsigned short *s,*d;
short x,y;
s=o_buf[now_frame%MAX_ANIM];
d=fr_buf;
printf("%02d\x0d",now_frame);
for( y=0; y<256; y++ ){
for( x=0; x<256; x++ ){
*d++=*s++;
}
}
now_frame++;
if( now_frame>MAX_ANIM ){
now_frame=0;
}
quick_exit:
return(0);
}
#endif
int Idle()
{
switch( global_step ){
case GS_MAKE: Make(); break;
// case GS_PLAY: Play(); break;
}
if( BITSNS(0x00)==0x02 ){
global_step=GS_EXIT;
KFLUSHIO(0xff);
}
return(0);
}
int Init(argc,argv)
int argc;
char *argv[];
{
global_step=GS_MAKE;
// screen(1,3,1,1);
screen(0,3,1,1);
now_frame=1;
return(0);
}
main(argc,argv)
int argc;
char *argv[];
{
Init(argc,argv);
while( global_step!=GS_EXIT ){
Idle();
Sync();
Save();
now_frame++;
if( now_frame>MAX_ANIM ){
break; //終わり
// now_frame=0;
// global_step=GS_PLAY;
}
}
}
/* [ EOF ] */